home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / Integer-digitMultiplyneg.st < prev    next >
Text File  |  1993-07-24  |  2KB  |  49 lines

  1. "    NAME        Integer-digitMultiplyneg
  2.     AUTHOR        TPH@cs.man.ac.uk
  3.     FUNCTION Parc performance enhancement 
  4.     ST-VERSIONS    2.2
  5.     PREREQUISITES     
  6.     CONFLICTS    
  7.     DISTRIBUTION      world
  8.     VERSION        1.1
  9.     DATE    22 Jan 1989
  10. SUMMARY    Integer-digitMultiplyneg
  11.       The most recent version of the ParcPlace
  12.    Newsletter has a goodie for improving the performance of integer
  13.    (both Small- and Large-) multiply.  This is it.  Works OK for VI2.2
  14.    images; it has not been tryed with VI2.3 images. TPH
  15. "!
  16. 'From Smalltalk-80, Version 2.2 of July 4, 1987 on 26 June 1989 at 5:23:43 am'!
  17.  
  18.  
  19.  
  20. !Integer methodsFor: 'private'!
  21.  
  22. digitMultiply: arg neg: ng 
  23.     "Answer the result of multiplying the receiver by
  24.     the argument arg, where the sign of the result is ng."
  25.  
  26.     | argSize mySize prod pl digit k acc |
  27.     argSize _ arg digitLength.
  28.     ((arg digitAt: 1) = 0 and: [argSize = 1]) ifTrue: [^0].
  29.     mySize _ self digitLength.
  30.     pl _ mySize + argSize.
  31.         "Make a better guess as to whether the product will 
  32.         overflow, to avoid having to copy the result."
  33.     ((self digitAt: mySize) + 1) * ((arg digitAt: argSize) + 1) < 256
  34.         ifTrue: [pl _ pl - 1].
  35.     prod _ Integer new: pl neg: ng.
  36.         "prod starts out all zero."
  37.     1 to: mySize do: [:i |
  38.         acc _ 0.
  39.         (digit _ self digitAt: i) ~=0 ifTrue: [
  40.             k _ i.
  41.                 "Loop invariant: 0<=acc<=16rFFFF, k=i+j-1."
  42.             1 to: argSize do: [:j |
  43.                 acc _ (arg digitAt: j) * digit + (prod digitAt: k) + (acc bitShift: -8).
  44.                 prod digitAt: k put: (acc bitAnd: 255).
  45.                 k _ k + 1].
  46.             acc >= 256 ifTrue: [
  47.                 prod digitAt: k put: (acc bitShift: -8)]]].
  48.     ^prod truncated! !
  49.